﻿using System;
using System.Drawing;
using System.Collections.Generic;

namespace Телега.Графические_объекты
{
    class Колесо : Квадрат, Графический_объект
    {
        public Колесо(Область_построения родитель, double Размер_колеса, Color цвет, double центр_X, double центр_Y, double угол_поворота = 0) : base(родитель, центр_X, центр_Y, Размер_колеса, цвет)
        {
            this.Цвет = цвет;
            this.Родитель = родитель;
            this.Ось_поворота = this.Найти_ось_вращения();
        }
        private Область_построения Родитель;
        Точка Ось_поворота;
        public Точка Центр
        {
            get
            {
                return this;
            }
        }
        public void Повернуть()
        {
            base.Повернуть(this.Ось_поворота.X, this.Ось_поворота.Y);
            this.Ось_поворота = this.Найти_ось_вращения();
        }
        /// <summary>
        /// Производит поиск самого правого касания колеса с поверхностью
        /// </summary>
        private Точка Найти_ось_вращения()
        {
            List<Точка> list = new List<Точка>();
            foreach (Линия линия in this.Стороны)
            {
                if (линия.Начало.X <= линия.Конец.X)
                    this.Проверка_линии_на_пересечение_с_поверхностью(ref list, линия.Начало.X, линия.Конец.X, линия.Начало.Y, линия.Конец.Y);
                else
                    this.Проверка_линии_на_пересечение_с_поверхностью(ref list, линия.Конец.X, линия.Начало.X, линия.Конец.Y, линия.Начало.Y);
            }
            if (list.Count > 0)
            {
                Точка С_максимальным_значением_X = list[0];
                foreach (Точка точка in list)
                {
                    if (точка.X > С_максимальным_значением_X.X)
                        С_максимальным_значением_X = точка;
                }
                return С_максимальным_значением_X;
            }
            else
                return this.Ось_поворота;
        }
        private void Проверка_линии_на_пересечение_с_поверхностью(ref List<Точка> list, double x1, double x2, double y1, double y2)
        {
            for (int x = (int)x1; x < (int)x2; x++)
            {
                double y = y1 + (y2 - y1) * (x - x1) / (x2 - x1);
                if (y <= this.Родитель.поверхность.Значение_для_X(x))
                {
                    list.Add(new Точка(this.Родитель, x, y, this.Цвет));
                }
            }
        }
    }
}
